﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Data.SqlClient;
using System.Configuration;

namespace Rizmar
{
    public partial class Sacado : Form
    {
        SqlConnection cn;

        public Sacado()
        {
            cn = new SqlConnection(ConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString);
            cn.Open();
            InitializeComponent();
        }

        ~Sacado()
        {
            cn.Close();
        }

        private void sairButton_Click(object sender, EventArgs e)
        {
            this.Close();
        }

        private bool validaInsert()
        {
            if (nomeTextBox.TextLength == 0)
            {
                MessageBox.Show("Nome vazio!");
                nomeTextBox.Focus();
                return false;
            }
            if (!validaCpf(documentoTextBox.Text) && !validaCnpj(documentoTextBox.Text))
            {
                MessageBox.Show("Documento inválido!");
                documentoTextBox.Focus();
                return false;
            }

            return true;
        }

        public void setTextboxes(string[] s)
        {
            int i = 0;

            /* Decidir se é CPF ou CNPJ */
            if (s[2].Length == 14)
            {
                cpfRadioButton.Checked = true;
                documentoTextBox.Mask = "000,000,000-00";
            }
            else
            {
                cnpjRadioButton.Checked = true;
                documentoTextBox.Mask = "00,000,000/0000-00";
            }

            /* Setar textboxes com dados cadastrais */
            foreach (Control c in splitContainer1.Panel1.Controls)
                if (c is TextBox || c is MaskedTextBox)
                    c.Text = s[i++];

            /* Listar títulos do cliente */
            string selectStr = "SELECT " +
                                        "Cliente.nome , " +
                                        "Sacado.nome , " +
                                        "Titulo.codigo , " +
                                        "Titulo.valor , " +
                                        "Titulo.tipo , " +
                                        "Titulo.banco , " +
                                        "Titulo.data_base , " +
                                        "Titulo.vencimento , " +
                                        "Titulo.dias , " +
                                        "Titulo.d , " +
                                        "Titulo.desagio , " +
                                        "Titulo.liquido , " +
                                        "Titulo.tipo_servico " +

                                    "FROM " +
                                        "dbo.Titulo " +
                                            "INNER JOIN dbo.Cliente ON dbo.Titulo.cliente_id = dbo.Cliente.id " +
                                            "INNER JOIN dbo.Sacado ON dbo.Titulo.sacado_id = dbo.Sacado.id " +

                                    "WHERE dbo.Titulo.sacado_id = " + s[0];

            SqlCommand selectCmd = new SqlCommand(selectStr, cn);
            using (SqlDataReader dr = selectCmd.ExecuteReader())
            {
                titulosTextBox.ResetText();
                while (dr.Read())
                {
                    titulosTextBox.AppendText("======================================================================================\n");
                    titulosTextBox.AppendText("CLIENTE...: " + dr["nome"].ToString() + "\n");
                    titulosTextBox.AppendText("SACADO....: " + dr[1].ToString() + "\n");
                    titulosTextBox.AppendText("VALOR.....: " + string.Format("{0:C}\n", float.Parse(dr["valor"].ToString())));
                }
                titulosTextBox.AppendText("======================================================================================\n");
            }
        }

        private void procuraDocumento()
        {
            SqlCommand selectCmd = new SqlCommand("SELECT id FROM Sacado WHERE documento = '" + documentoTextBox.Text + "'", cn);
            using (SqlDataReader dr = selectCmd.ExecuteReader())
            {
                if (dr.HasRows)
                    while (dr.Read())
                    {
                        if (idTextBox.Text != dr["id"].ToString())
                        {
                            MessageBox.Show("Cliente já cadastrado com o código " + dr["id"] + ". Verifique.");
                            if (documentoTextBox.TextLength > 0)
                            {
                                documentoTextBox.Focus();
                                documentoTextBox.SelectAll();
                            }
                        }
                    }
            }
        }

        public void zerarCampos()
        {
            foreach (Control c in splitContainer1.Panel1.Controls)
                if (c is TextBox || c is MaskedTextBox)
                    c.ResetText();
        }

        public bool validaCnpj(string cnpj)
        {
            int[] multiplicador1 = new int[12] { 5, 4, 3, 2, 9, 8, 7, 6, 5, 4, 3, 2 };
            int[] multiplicador2 = new int[13] { 6, 5, 4, 3, 2, 9, 8, 7, 6, 5, 4, 3, 2 };
            int soma;
            int resto;
            string digito;
            string tempCnpj;
            cnpj = cnpj.Trim();
            cnpj = cnpj.Replace(".", "").Replace("-", "").Replace("/", "");
            if (cnpj.Length != 14) return false;
            tempCnpj = cnpj.Substring(0, 12);
            soma = 0;
            for (int i = 0; i < 12; i++)
                soma += int.Parse(tempCnpj[i].ToString()) * multiplicador1[i];
            resto = (soma % 11);
            if (resto < 2)
                resto = 0;
            else
                resto = 11 - resto;
            digito = resto.ToString();
            tempCnpj = tempCnpj + digito;
            soma = 0;
            for (int i = 0; i < 13; i++)
                soma += int.Parse(tempCnpj[i].ToString()) * multiplicador2[i];
            resto = (soma % 11);
            if (resto < 2)
                resto = 0;
            else
                resto = 11 - resto;
            digito = digito + resto.ToString();
            return cnpj.EndsWith(digito);
        }

        public bool validaCpf(string cpf)
        {
            int[] multiplicador1 = new int[9] { 10, 9, 8, 7, 6, 5, 4, 3, 2 };
            int[] multiplicador2 = new int[10] { 11, 10, 9, 8, 7, 6, 5, 4, 3, 2 };
            string tempCpf;
            string digito;
            int soma;
            int resto;
            cpf = cpf.Trim();
            cpf = cpf.Replace(".", "").Replace("-", "");
            if (cpf.Length != 11)
                return false;
            tempCpf = cpf.Substring(0, 9);
            soma = 0;
            for (int i = 0; i < 9; i++)
                soma += int.Parse(tempCpf[i].ToString()) * multiplicador1[i];
            resto = soma % 11;
            if (resto < 2)
                resto = 0;
            else
                resto = 11 - resto;
            digito = resto.ToString();
            tempCpf = tempCpf + digito;
            soma = 0;
            for (int i = 0; i < 10; i++)
                soma += int.Parse(tempCpf[i].ToString()) * multiplicador2[i];
            resto = soma % 11;
            if (resto < 2)
                resto = 0;
            else
                resto = 11 - resto;
            digito = digito + resto.ToString();
            return cpf.EndsWith(digito);
        }

        private void idTextBox_Leave(object sender, EventArgs e)
        {
            if (idTextBox.TextLength > 0 && idTextBox.Text != "0")
            {
                string selectString = "SELECT * FROM Sacado WHERE id = " + idTextBox.Text + "";
                string[] colunas = new string[] { "id", "nome", "documento", "logradouro", "numero", "complemento", "bairro", "cep", "cidade", "estado", "telefone", "celular", "email", "obs" };
                string[] atributos = new string[14];

                SqlCommand selectCommand = new SqlCommand(selectString, cn);
                using (SqlDataReader dr = selectCommand.ExecuteReader())
                {
                    if (!dr.HasRows)
                    {
                        MessageBox.Show("Código inválido");
                        idTextBox.Focus();
                        idTextBox.SelectAll();
                    }
                    else
                    {
                        dr.Read();

                        for (int i = 0; i < 14; i++)
                            atributos[i] = dr[colunas[i]].ToString();

                        dr.Close();
                        setTextboxes(atributos);
                    }
                }
            }
            else zerarCampos();
        }

        private void nomeTextBox_Leave(object sender, EventArgs e)
        {
            nomeTextBox.Text = nomeTextBox.Text.Trim();

            SqlCommand selectCmd = new SqlCommand("SELECT id FROM Cliente WHERE nome = '" + nomeTextBox.Text + "'", cn);
            using (SqlDataReader dr = selectCmd.ExecuteReader())
            {
                if (dr.HasRows)
                    while (dr.Read())
                    {
                        if (idTextBox.Text != dr["id"].ToString())
                        {
                            MessageBox.Show("Cliente já cadastrado com o código " + dr["id"] + ". Verifique.");
                            nomeTextBox.Focus();
                            nomeTextBox.SelectAll();
                        }
                    }
            }
        }

        private void documentoTextBox_Leave(object sender, EventArgs e)
        {
            if (!documentoTextBox.Text.StartsWith(" "))
                if (!validaCpf(documentoTextBox.Text) && !validaCpf(documentoTextBox.Text))
                {
                    MessageBox.Show("Documento inválido!");
                    documentoTextBox.Focus();
                    documentoTextBox.SelectAll();
                }
                else
                {
                    SqlCommand selectCmd = new SqlCommand("SELECT id FROM Sacado WHERE documento = '" + documentoTextBox.Text + "'", cn);
                    using (SqlDataReader dr = selectCmd.ExecuteReader())
                    {
                        if (dr.HasRows)
                        {
                            dr.Read();
                            MessageBox.Show("Sacado já cadastrado com o código " + dr["id"] + "!");
                        }
                    }
                }
        }

        private void pesquisarButton_Click(object sender, EventArgs e)
        {
            PesquisaSacadoForm janela = new PesquisaSacadoForm(this);
            janela.Show();
        }

        private void deletarButton_Click(object sender, EventArgs e)
        {
            if (idTextBox.TextLength > 0 && int.Parse(idTextBox.Text) > 0)
            {
                bool confirma = (MessageBox.Show("Tem certeza de que deseja excluir o usuário selecionado?", "Confirmação", MessageBoxButtons.YesNo) == System.Windows.Forms.DialogResult.Yes);
                if (confirma)
                {
                    string deleteStr = "DELETE FROM Sacado WHERE id = " + idTextBox.Text;

                    using (SqlCommand deleteCmd = new SqlCommand(deleteStr, cn))
                    {
                        try
                        {
                            if (deleteCmd.ExecuteNonQuery() > 0)
                            {
                                MessageBox.Show("Sacado excluído com sucesso!");
                                zerarCampos();
                            }
                        }
                        catch (SqlException)
                        {
                            MessageBox.Show("Impossível excluir o sacado selecionado.");
                        }
                    }
                }
            }
            else MessageBox.Show("ID inválido!");
        }

        private void incluirButton_Click(object sender, EventArgs e)
        {
            if (idTextBox.TextLength == 0)
            {
                if (validaInsert())
                {
                    string insertStr1 = "INSERT INTO Sacado (";
                    string insertStr2 = "VALUES (";

                    foreach (Control c in splitContainer1.Panel1.Controls)
                        if (c is TextBox || c is MaskedTextBox)
                            if (c.Text.Length > 0 && !c.Text.StartsWith(" "))
                            {
                                insertStr1 += c.Name.Remove(c.Name.Length - 7).ToLower() + ",";
                                /* nvarchar precisa de aspas; int, float e real não */
                                if (c.Name == "idTextBox" || c.Name == "numeroTextBox")
                                    insertStr2 += string.Format("{0},", c.Text);
                                else
                                    insertStr2 += string.Format("'{0}',", c.Text);
                            }

                    insertStr1 += "status) ";
                    insertStr2 += "1) ";

                    using (SqlCommand insertCmd = new SqlCommand(insertStr1 + insertStr2, cn))
                    {
                        try
                        {
                            if (insertCmd.ExecuteNonQuery() > 0)
                            {
                                MessageBox.Show("Sacado inserido com sucesso!");
                                zerarCampos();
                            }
                        }
                        catch (SqlException)
                        {
                            MessageBox.Show("Existem campos inválidos. Verifique");
                        }
                    }
                }
            }
            else            // alterar cadastro existente
            {
                bool confirma = MessageBox.Show("Confirma as alterações no cadastro?", "Confirmação", MessageBoxButtons.YesNo) == DialogResult.Yes;
                if (confirma)
                {
                    string updateStr = "UPDATE Sacado SET ";

                    foreach (Control c in splitContainer1.Panel1.Controls)
                        if (c is TextBox || c is MaskedTextBox)
                        {
                            if (c.Name == "numeroTextBox")
                                updateStr += string.Format("numero = {0}, ", c.Text);
                            else if (c.Name != "idTextBox")
                                updateStr += string.Format("{0} = '{1}', ", c.Name.Remove(c.Name.Length - 7).ToLower(), c.Text);
                        }

                    updateStr = updateStr.Trim();
                    updateStr = updateStr.TrimEnd(',');
                    updateStr += string.Format("WHERE id = {0}", idTextBox.Text);

                    using (SqlCommand updateCmd = new SqlCommand(updateStr, cn))
                    {
                        try
                        {
                            if (updateCmd.ExecuteNonQuery() > 0)
                            {
                                MessageBox.Show("Dados alterados com sucesso!");
                                zerarCampos();
                            }
                        }
                        catch (SqlException)
                        {
                            MessageBox.Show("Impossível alterar o sacado selecionado. ");
                        }
                    }
                }
            }
        }

        private void cpfRadioButton_CheckedChanged(object sender, EventArgs e)
        {
            if (cpfRadioButton.Checked)
                documentoTextBox.Mask = "000,000,000-00";
            else
                documentoTextBox.Mask = "00,000,000/0000-00";
        }

        private void sacadoForm_KeyPress(object sender, KeyPressEventArgs e)
        {
            if (e.KeyChar == '\r')
            {
                e.Handled = true;
                System.Windows.Forms.SendKeys.Send("{TAB}");
            }
        }

        private void novoButton_Click(object sender, EventArgs e)
        {
            MessageBox.Show("Pra que serve essa porra");
        }
    }
}
